'''
https://leetcode.cn/problems/single-number-ii/description/
'''
from typing import List


class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        res = 0
        for i in range(33):
            total = sum([t >> i & 1 for t in nums])
            if total % 3 != 0:
                # Python 这里对于最高位需要特殊判断
                # 31 位表示为负数，直接|= python还是会自动扩大数字范围
                # 4: 0b100        -4: -0b100
                #       这是个坑,bin函数只是显示，实际上还是补码存储，得自己计算
                #       last_1 = x & (-x)，可以得到最后一个1，说明它实际上还是补码存储的
                #       即 -x的二进制    = (~|x|) + 1    绝对值，取反再加一
                #           x = (~(-x-1))              剪一，在取反
                # pass. 不考虑细节
                if i == 31:
                    res -= (1 << i)
                else:
                    res |= (1 << i)
        return res
